#include "../include/teacher.h"
//创建单链表
t_list* init_teacher(void)
{
    t_list* list=(t_list*)malloc(sizeof(t_list));
    if(list==NULL)
    {
        list->next=NULL;
    }
    else
    {
        printf("创建单链表成功!\n");
        return NULL;
    }
    return list;
}

// 单链表的插入
void insert_teacher_node(t_list* list,t_data data,int pos)
{
    t_node* new_node =(t_node*)malloc(sizeof(t_node));
    if(new_node == NULL)
    {
        printf("创建新节点失败\n");
        return;
    }
    new_node->data=data;
    new_node->next=NULL;
    
    //判断是否为第一个元素或者链表为空
    if(pos == 0 || list->next == NULL)
    {
        new_node->next=list->next;
        list->next=new_node;
        return;
    }
    //开始遍历，找到要插入位置的前一个元素
    t_node* ptr=list->next;
    for(int i=1; i<pos-1 && ptr!=NULL; i++)
    {
        ptr=ptr->next;//遍历下一个结点
    }
    //已经遍历到NULL位置
    if(ptr == NULL)
    {
        printf("插入位置超出范围\n");
        free(new_node);
        return;
    }
     // 将新节点的next指针指向原插入位置的节点，将前一个节点的next指针指向新节点
     new_node->next=ptr->next;
     ptr->next=new_node;
}

// 单链表的删除
void delete_teacher_node(t_list* list, int pos)
{
    if(list==NULL)
    {
        printf("链表不存在\n");
        return;
    }
    //删头节点

    if(pos == 1)
    {
       if(list->next == NULL)
       {
         printf("链表为空,无法删除\n");
         return;
       }

    t_node* ptr=list->next;
    list->next=list->next->next;
    free(ptr);
    return;
    }
    //任意位置删除
    t_node* p = list->next;
    t_node* q = NULL;

    //遍历链表，找到要删除结点的前一个结p
    for(int i =1; i < pos-1; i++)
    {
        p=p->next;
    }
    //如果没找到，或者要删除的结点已经是最后一个
    if(p==NULL ||p->next==NULL)
    {
        printf("要删除的结点不存在\n");
        return;
    }
    q=p->next;
    p->next=q->next;
    free(q);
    return;
    
  
}

// 单链表的查找
t_node* find_teacher_node_password(t_list* list, char* password)
{
     if(list==NULL)
    {
        printf("链表不存在\n");
        return NULL;
    }
    if(list->next == NULL)
    {
        printf("链表数据为空\n");
        return NULL;
    }
    //创建一个指针来遍历
    t_node* ptr=list->next;
   
    //遍历链表
    for(size_t i=0;ptr!=NULL; i++)
    {
         // 如果链表遍历到尽头还未找到指定位置的节点，则返回 NULL
        if(ptr==NULL)
        {
            printf("位置不存在结点\n");
            return NULL;
        }
        if(!strcmp(password,ptr->data.password))
        {
            printf("找到了%s\n",ptr->data.password);
            return ptr;
        }
        //否则继续向后移动
        ptr=ptr->next;

    }
    //返回找到的结点指针
    printf("没找到\n");
    return NULL;
}
t_node* find_teacher_node_id(t_list* list, int id)
{
    if(list==NULL)
    {
        printf("链表不存在\n");
        return NULL;
    }
    if(list->next == NULL)
    {
        printf("链表数据为空\n");
        return NULL;
    }
    //创建一个指针来遍历
    t_node* ptr=list->next;
    //遍历链表
    for(size_t i=0;ptr!=NULL; i++)
    {
         // 如果链表遍历到尽头还未找到指定位置的节点，则返回 NULL
        if(ptr==NULL)
        {
            printf("位置不存在结点\n");
            return NULL;
        }
        if(id==ptr->data.id)
        {
            printf("您输入的账号存在\n");
            return ptr;
        }
        //否则继续向后移动
        ptr=ptr->next;
    }
    //返回找到的结点指针
    printf("没找到\n");
    return NULL;
}
t_node *find_teacher_node_name(t_list* list,char* name)
{
     if(list==NULL)
    {
        printf("链表不存在\n");
        return NULL;
    }
    if(list->next == NULL)
    {
        printf("链表数据为空\n");
        return NULL;
    }
    //创建一个指针来遍历
    t_node* ptr=list->next;
   
    //遍历链表
    for(size_t i=0;ptr!=NULL; i++)
    {
         // 如果链表遍历到尽头还未找到指定位置的节点，则返回 NULL
        if(ptr==NULL)
        {
            printf("位置不存在结点\n");
            return NULL;
        }
        if(!strcmp(name,ptr->data.name))
        {
            printf("找到了%s\n",ptr->data.name);
            return ptr;
        }
        //否则继续向后移动
        ptr=ptr->next;

    }
    //返回找到的结点指针
    printf("没找到\n");
    return NULL;
}
// 单链表的遍历
void print_teacher(t_list* list)
{
     if(list == NULL)
    {
        printf("链表不存在\n");
        return;
    }
    if(list->next == NULL)
    {
        printf("链表为空\n");
        return;
    }
    t_node *ptr = list->next;

    // 遍历链表并打印节点数据
    while(ptr != NULL)
    {   
        printf("姓名:%s\t密码%s:\t账号:%d\n",ptr->data.name,ptr->data.password,ptr->data.id);
        // 将指针移到下一个节点
        ptr =ptr->next;
    }
}

// 修改
void change(void)
{   
    u_list *list = init_register();
    
    F_scanf(list,FILE1);
    
    
    F_print(list,FILE1);
    print_register(list);
    
    printf("更改信息\n");
    int id;
    printf("请输入要更改的学生id:");
    scanf("%d", &id);
    user_node *ptr;
    ptr=find_node_id(list, id);
   
    while (1)
    {
        if (ptr->data.id == id)
        {
            printf("请重新输入信息：\n");
            printf("姓名：");
            scanf("%s", ptr->data.name);
            printf("密码：");
            scanf("%s", ptr->data.password);
            printf("学号：");
            scanf("%d", &ptr->data.id);
            list->next->data.id=ptr->data.id;
            strcpy(list->next->data.name, ptr->data.name);
            strcpy(list->next->data.password, ptr->data.password);
            F_print(list, FILE1);
            break;
        }
        else
        {
            printf("没有找到该学生!\n");
            break;
        }
    }
   
}





void f_print(t_list* list,const char * file_name)
{
    FILE *fp = fopen(file_name, "w");
    if(fp == NULL)
    {
        printf("文件创建失败");
        return;
    }

     // 光标移动到开头
    fseek(fp , 0 , SEEK_SET);


    t_node *ptr = list->next;
    while(ptr!= NULL)
    {
        fprintf(fp, "%s %s %d\n", ptr->data.name, ptr->data.password, ptr->data.id);
        ptr = ptr->next;
    }
    fclose(fp);
}
void f_scanf(t_list* list,const char * file_name)
{
     FILE *fp = fopen(file_name, "r");
    if(fp==NULL)
    {
        printf("文件打开失败");
        return;
    }

    // 移动光标到头
    fseek( fp , 0 , SEEK_SET );


    char ch ='0';
    int len = 0;
    while(EOF !=(ch=fgetc(fp)))
    {
        if('\n' == ch)
        {
            len++;
        }
    }

     // 移动光标到头
    fseek( fp , 0 , SEEK_SET );
    t_data data;
    //user_node * ptr = list->next;
    for (size_t i = 0; i < len; i++)
    {
        fscanf( fp , "%s\t%s\t%d\n" , data.name , data.password , &data.id);
        insert_teacher_node( list , data , i  );
    }

    fclose(fp);
    return ;
}